package de.hb.bv2.u04;

public class Point
{
	public double x, y; // x- und y-Koordinate des Punktes.


	/**
     * Konstruktor der Klasse Point.
     * 
     * @param x Die x-Koordinate des Punktes.
     * @param y Die y-Koordinate des Punktes.
     */
    public Point(double x, double y)
    {
        this.x = x;
        this.y = y;
    }


	/**
     * Konstruktor der Klasse Point.
     * 
     * @param p Ein Punkt, von dem eine Tiefe
     *          Kopie erstellt werden soll.
     */
    public Point(Point p)
    {
        this(p.x, p.y);
    }


	/**
     * Diese Methode erzeugt einen neuen Punkt, 
     * der den aktuellen Punkt relativ zum Punkt p 
     * als Nullpunkt darstellt.
     * 
     * @param p Bezugspunkt.
     *          
     * @return Der aktuelle Punkt als Nullpunkt.
     */
    public Point relTo(Point p)
    {
        return new Point(x-p.x, y-p.y);
    }


	/**
     * Diese Methode erzeugt einen neuen Punkt,
     * der den aktuellen Punkt um x0 und y0
     * verschiebt.
     * 
     * @param x0 Verschiebung in x-Richtung.
     * @param y0 Verschiebung in y-Richtung.
     *          
     * @return Der verschobene Punkt.
     */
    public Point moved(double x0, double y0)
    {
        return new Point(x+x0, y+y0);
    }

    
	/**
     * Diese Methode berechnet das Kreuzprodukt.
     * 
     * @param p Der Punkt, der mit dem aktuellem Punkt
     *          das Kreuzprodukt bildet.
     *          
     * @return Das Kreuzprodukt.
     */
    public double cross(Point p)
    {
        return x * p.y - p.x * y;
    }


	/**
     * Diese Methode berechnet den doppelten 
     * Flaecheninhalt des Dreiecks, das durch die
     * Punkte p0, p1 und den aktuellen Punkt gebildet 
     * wird.
     * 
     * @param p0 Ein Eckpunkt des Dreiecks.
     * @param p1 Ein Eckpunkt des Dreiecks.
     *          
     * @return Der doppelte Flaecheninhalt des Dreiecks.
     */
    public double area2(Point p0, Point p1)
    {
        return p0.relTo(this).cross(p1.relTo(this));
    }


	/**
     * Diese Methode berechnet den doppelten 
     * Flaecheninhalt des Dreiecks, das durch die
     * Gerade g und den aktuellen Punkt gebildet 
     * wird.
     * 
     * @param g Eine Gerade des Dreiecks.
     *          
     * @return Der doppelte Flaecheninhalt des Dreiecks.
     */
    public double area2(Line g)
    {
        return area2(g.p0, g.p1);
    }


	/**
     * Diese Methode gibt an, ob der aktuelle Punkt
     * rechts von der Geraden liegt oder nicht.
     * 
     * @param g Die zu betrachtende Gerade.
     *          
     * @return True, wenn der aktuelle Punkt rechts
     *         von der Geraden liegt. Ansonsten False.
     */
    public boolean isRightOf(Line g)
    {
        return area2(g) < 0;
    }
}
